// Grunt 的入口文件
// 用于定义一些需要Grunt 自动执行的任务
// 需要导出一个函数
// 此函数接收一个grunt的形参，内部提供一些创建任务时可以涌动啊的API

module.exports = grunt => {
    // 注册任务 'foo' 任务名字 后面是一个任务函数, 当任务发生时，自动执行的函数
    // 执行的时候 yarn grunt foo  指定运行名称
    grunt.registerTask('foo', () => {
        console.log('hello grunt')
    })
    // 第二个参数是这个任务的描述 他会出现在grunt的帮助下 yarn grunt --help
    grunt.registerTask('bar', "任务描述", () => {
        console.log('other task');        
    })
    // 如果名字是default 运行时不需要指定名称, 会一次执行数组中的任务
    grunt.registerTask('default', ['foo', 'bar'])

    // 模拟异步，默认支持同步形式
    grunt.registerTask('async', () => {
        setTimeout(() => {
            console.log('async task working~');
        }, 1000)
    })
    // 实现异步任务
    grunt.registerTask('async-task', function() {
        const done = this.async()
        setTimeout(() => {
            console.log('async task working~');
            done() // 告诉grunt这是个异步任务
        }, 1000)
    })

    grunt.registerTask('newtast', "任务描述", () => {
        console.log('other task');   
        return false     
    })
    // 这时执行default，就会是任务失败
    grunt.registerTask('default', ['newtast', 'bar'])

    grunt.registerTask('bad-async', function() {
        const done = this.async()
        setTimeout(() => {
            console.log('bad async task');
            done(false) // 告诉grunt这是个异步任务
        }, 1000)
    })

    /***
     * 以下是配置选项方法
     */
    grunt.initConfig({
        // foo: 'bar'
        foo: {
            bar: 123
        }
    })

    grunt.registerTask('aaa', () => {
        console.log(grunt.config('foo'))
    })

    /**
     * 和下面的多目标模式配合使用；他们的名称都一样 
     */
    grunt.initConfig({       
        build: {
            options: {
                foo: 'bar'
            },
            // css: '1',   // 相当于子任务，  可以用命令单独执行yarn grunt:css
            css: {
                options: {
                    foo: 'aaa'  // 会覆盖上面的foo的值
                }
            },
            js: '2'
        }
    })
    /**
     * 多目标模式，可以让任务根据配置形成多个子任务
     */
    grunt.registerMultiTask('build', function () {
        console.log(this.options())
        console.log(`tarfet: ${this.target}, data: ${this.data}`);  // tarfet: css, data: 1    tarfet: js, data: 2
    })

}